package com.qf.utils;

import com.qf.entity.Publist;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 帮助用户-把formdata提交的数据，进行数据拆解，并把文本内容和文件内容进行区分
 * 需要完成文件内容的上传-文本内容存储使用dao层访问数据库
 */
public class Upload {

    public Publist upload_file(String path, HttpServletRequest req) {
        // 【1】实例化一个空的发布对象
        Publist publist = new Publist();
        // 【2】查询formdata是否是多文件提交
        // 如果是多文件提交 - 返回true  如果不是返回false
        if(!ServletFileUpload.isMultipartContent(req)){
            System.out.println("无上传文件");
            return null;
        }
        // 【3】需要判断上传的位置是否存在
        File file = new File(path);
        // 【4】判断是否是一个文件夹-并需要判断文件夹是否存在
        if(!file.exists()&&!file.isDirectory()){
        //     如果不存在-就需要进行创建
            file.mkdir();
        }
        // 【5】进行文件上传的初始化配置
        ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
        // 【6】设置路径的编码格式 - 避免有乱码 - 请求头文件中进行设置
        servletFileUpload.setHeaderEncoding("utf-8");
        // 【7】获取请求对象中的formdata数据 - 把请求进行解析 -转换一下请求类型
        ServletRequestContext servletRequestContext = new ServletRequestContext(req);
        // 【8】需要把请求内容做拆分 - 判断是文本还是文件
        try {
            List<FileItem> fileItems = servletFileUpload.parseRequest(servletRequestContext);
        //     本次提交只包含一个文本和一张图片
            System.out.println(fileItems.size());
        //     【9】通过遍历循环的形式判断是普通文本还是文件
            for(FileItem item:fileItems){
                // isFormField:用于判断当前对象是文本还是文件-如果是文本返回true 如果是文件返回false
                if(item.isFormField()){
                //     文本内容
                    System.out.println("文本："+item);
                    String fieldName = item.getFieldName(); //获取到input输入框的name
                    String value = item.getString("utf-8");//设置value值为utf-8形式 -默认字节码格式18 bytes
                    switch (fieldName){
                        case "publish-content-txt":
                            System.out.println("文章内容："+value);
                            publist.setNContentText(value);
                            break;
                        case "nickname":
                            System.out.println("昵称为："+value);
                            publist.setNNickname(value);
                            break;
                        case "sign":
                            System.out.println("签名："+value);
                            publist.setNSign(value);
                            break;
                    }

                }else {
                //     文件内容
                    System.out.println("文件："+item);
                    String fieldName = item.getFieldName(); //获取到input输入框的name
                    // 判断用时是否上传了文件
                    if(fieldName ==null||fieldName.equals("")){
                        //跳过当前循环
                        continue;
                    }

                    switch (fieldName){
                        case "publish-content-img":
                            System.out.println("文件的名称："+item.getName());
                            publist.setNContentImg(item.getName());
                            // 上传图片
                            InputStream inputStream = item.getInputStream();  //表示字节码的图片信息
                            //创建一个输出流用于保存图片到服务器
                            FileOutputStream fileOutputStream = new FileOutputStream(path + "/" + item.getName());
                            // 创建一个缓存在字节数组
                            byte[] bytes = new byte[1024];
                            int len = 0;
                            //循环读取和写入
                            while ((len = inputStream.read(bytes))>0){
                                fileOutputStream.write(bytes,0,len);
                            }
                            inputStream.close();
                            fileOutputStream.close();



                            break;
                    }





                }
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        // 添加一个上传时间
        String uptime = new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date());
        publist.setNCreatetime(uptime);

        return publist;
    }
}
